package controller;

import antlr.collections.impl.Vector;
import com.lowagie.text.Document;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.rtf.RtfWriter2;
import dao.ListaJpaController;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import dao.exceptions.NonexistentEntityException;
import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Date;
import javax.faces.context.FacesContext;
import javax.naming.Context;
import javax.servlet.ServletContext;
import model.Disciplina;
import model.DisciplinaProfessor;
import model.Item;
import model.Lista;
import model.ListaDisciplina;
import model.Questao;
import model.QuestaoLista;
import model.TipoQuestao;
import pagecontroller.JsfUtil;

/**
 *
 * @author Edilson Fernandes da Costa
 * @version 1.0
 */
public class ListaController extends Controller {

    public ListaController() {
        if (JsfUtil.getObjectFromSession("ListaJpaController") == null) {
            jpaController = new ListaJpaController();
        } else {
            jpaController = (ListaJpaController) JsfUtil.getObjectFromSession("ListaJpaController");
        }
    }
    private Lista lista = null;
    private Lista listaAux = null;
    private ListaJpaController jpaController = null;
    private List<Lista> listas = null;
    private List<Questao> questoesDaLista;
    private List<Disciplina> disciplinas;
    private ListaDisciplina listaDisciplina;
    private DisciplinaProfessor disciplinaProfessor;
    private List<DisciplinaProfessor> disciplinaProfessors;
    private List<Questao> questaos;
    private String cabecalho;

    public ListaController(List<Questao> questoesDaLista, Vector vect) {
        this.questoesDaLista = questoesDaLista;
        this.vect = vect;
    }

    public void clear() {
        lista = null;
        this.listas = null;
    }

    public String setPageListaCad() {
        clear();


        if (getDisciplinaProfessors() == null || getDisciplinaProfessors().size() == 0) {
            JsfUtil.addErrorMessage("Cadastre Disciplina Primeiro");
            getDisciplinaProfessorController().setPageDisciplinaCad();
            return "refreshPage";
        }

        getPageManager().setPageListaCad();
        return "refreshPage";
    }

    public String persiste() {
        if (lista.getId() == null) {
            return create();
        } else {
            return update();
        }
    }

    public String update() {
        try {

            getListaDisciplina().setLista(getLista());
            getListaDisciplina().setDisciplinaProfessor(getDisciplinaProfessor());

            getListaDisciplinaController().getJpaController().edit(getListaDisciplina());

            jpaController.edit(lista);

            listaAux = lista;
            this.lista = null;
            JsfUtil.addSuccessMessage("Lista Atualizado com Sucesso");
            getPageManager().setPageListaRelat();
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(ListaController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(ListaController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return "refreshPage";
    }

    public String create() {
        try {
            lista.setProfessor(getUsuarioLogado().getProfessor());
            lista.setDataCriacao(new Date());

            jpaController.create(lista);

            getListaDisciplina().setLista(getLista());
            getListaDisciplina().setDisciplinaProfessor(getDisciplinaProfessor());

            getListaDisciplinaController().getJpaController().create(getListaDisciplina());

            listaAux = lista;
            lista = null;
            JsfUtil.addSuccessMessage("Lista cadastrado com sucesso.");
            getPageManager().setPageListaRelat();
        } catch (Exception e) {
            JsfUtil.ensureAddErrorMessage(e, "Ocorreu um erro na percistencia dos dados.");
            return null;
        }
        return "refreshPage";
    }

    public String edit() {
        Lista listaTemp = (Lista) JsfUtil.getObjectFromRequestParameter("listaTemp");
        this.lista = listaTemp;
        getPageManager().setPageListaCad();
        return "refreshPage";
    }

    public String destroy() {
        Lista listaTemp = (Lista) JsfUtil.getObjectFromRequestParameter("lista");
        try {
            jpaController.destroy(listaTemp.getId());
            JsfUtil.addSuccessMessage("Lista removido com sucesso.");
        } catch (NonexistentEntityException ex) {
            Logger.getLogger(ListaController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }

    public Lista getLista() {
        if (lista == null) {
            lista = new Lista();
        }
        return lista;
    }

    public List<Lista> getListas() {
        this.listas = jpaController.findListaEntities();
        return this.listas;
    }

    public List<Lista> getListasProfessor() {
        try {
            List<Lista> ls = jpaController.findLista(getUsuarioLogado().getProfessor());
//            for(Lista l:ls){
//                l.getNumeroQuestoes();
//            }
            return ls;
        } catch (Exception ex) {
            return new ArrayList<Lista>();
        }
    }

    public ListaJpaController getJpaController() {
        return jpaController;
    }

    public Lista getListaAux() {
        if (listaAux == null) {
            listaAux = getLista();
        }
        return listaAux;
    }

    public void setListaAux(Lista listaAux) {
        this.listaAux = listaAux;
    }
    
    

    public String load() {
        listaAux = (Lista) JsfUtil.getObjectFromRequestParameter("listaTemp");
        getPageManager().setPageListaRelat();
        return "refreshPage";
    }

    public String print() {
        listaAux = (Lista) JsfUtil.getObjectFromRequestParameter("listaTemp");
        getPageManager().setPageListaPrint();
        return "refreshPage";
    }

    public String editButton() {
        this.lista = listaAux;
        getPageManager().setPageListaCad();

        return "refreshPage";
    }

    public String destroyButton() {
        Lista listaTemp = listaAux;
        try {
            jpaController.destroy(listaTemp.getId());
            JsfUtil.addSuccessMessage("Lista removida com sucesso.");
            listaAux = null;

        } catch (NonexistentEntityException ex) {
            Logger.getLogger(AlunoController.class.getName()).log(Level.SEVERE, null, ex);
        }

        return "refreshPage";
    }
    Vector vect;

    public boolean remove(String str) {



        return false;
    }

    public List<Questao> getQuestoesDaLista() {
        questoesDaLista = new ArrayList<Questao>();


        for (QuestaoLista ql : getListaAux().getQuestaoListas()) {
            questoesDaLista.add(ql.getQuestaoProfessor().getQuestao());
        }

        return questoesDaLista;
    }

    public void setQuestoesDaLista(List<Questao> questoesDaLista) {
        this.questoesDaLista = questoesDaLista;
    }

    public List<Disciplina> getDisciplinas() {
        DisciplinaController disciplinaController = (DisciplinaController) JsfUtil.getObjectFromSession("DisciplinaController");
        if (disciplinaController == null) {
            disciplinaController = new DisciplinaController();
        }
        disciplinas = disciplinaController.getDisciplinas(getUsuarioLogado().getProfessor());
        return disciplinas;
    }

    public void setDisciplinas(List<Disciplina> disciplinas) {
        this.disciplinas = disciplinas;
    }

    public ListaDisciplina getListaDisciplina() {
        if (listaDisciplina == null) {
            listaDisciplina = new ListaDisciplina();
            listaDisciplina.setDisciplinaProfessor(new DisciplinaProfessor());
        }
        return listaDisciplina;
    }

    public void setListaDisciplina(ListaDisciplina listaDisciplina) {
        this.listaDisciplina = listaDisciplina;
    }

    public DisciplinaProfessor getDisciplinaProfessor() {
        if (disciplinaProfessor == null) {
            disciplinaProfessor = getDisciplinaProfessors().get(0);
        }

        return disciplinaProfessor;
    }

    public void setDisciplinaProfessor(DisciplinaProfessor disciplinaProfessor) {
        this.disciplinaProfessor = disciplinaProfessor;
    }

    public List<DisciplinaProfessor> getDisciplinaProfessors() {
        disciplinaProfessors = getDisciplinaProfessorController().getDisciplinaProfessorLogado();
        return disciplinaProfessors;
    }

    public void setDisciplinaProfessors(List<DisciplinaProfessor> disciplinaProfessors) {
        this.disciplinaProfessors = disciplinaProfessors;
    }

    public List<Questao> getQuestaos() {
        questaos = new ArrayList<Questao>();
        for (QuestaoLista ql : getQuestaoListaController().getQuestaoListas(getListaAux())) {
            questaos.add(ql.getQuestaoProfessor().getQuestao());
        }

        return questaos;
    }

    public void setQuestaos(List<Questao> questaos) {
        this.questaos = questaos;
    }

    public String getCabecalho() {
        return cabecalho;
    }

    public void setCabecalho(String cabecalho) {
        this.cabecalho = cabecalho;
    }

    public String getDownload() {


        FileOutputStream file = null;
        String urlArquivo = "";
        String nomeArquivo = "lista.doc";
        try {

            FacesContext facesContext = FacesContext.getCurrentInstance();
            ServletContext scontext = (ServletContext) facesContext.getExternalContext().getContext();
            urlArquivo = scontext.getRealPath(nomeArquivo);

            file = new FileOutputStream(urlArquivo);
            Document document = new Document();
            RtfWriter2.getInstance(document, file);
            document.open();

            document.add(new Paragraph(getListaAux().getTitulo()));
            Questao q;
            int n = 0;

            String texto = "";

            for (QuestaoLista ql : getQuestaoListaController().getQuestaoListas(getListaAux())) {
                texto = "";
                q = ql.getQuestaoProfessor().getQuestao();
                texto += "\n" + (++n) + " - " + q.getAutor() + " - " + q.getEnunciado() + "\n";
                texto += "\t"+q.getTextoAjuda() + "\n";
//

                char c = 'a';
                for (Item i : getItemController().getItems(q)) {
                    if (q.getTipoQuestao() != TipoQuestao.DESCRITIVA) {
                        texto += "\t"+(c++) + " (  ) - " + i.getDescricao() + "\n";
                    }
                }

                texto = tratamento(texto);

                document.add(new Paragraph(texto));
            }

            document.close();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        return nomeArquivo;

    }

    private String tratamento(String texto) {
        int a1, a2;

        while (true) {

            a1 = texto.indexOf("<");
            if (a1 > 0) {
                a2 = texto.indexOf(">");
                if (a2 > 0) {
                    texto = texto.substring(0, a1) + texto.substring(a2+1, texto.length());
                }
            } else {
                break;
            }

        }


        return texto;
    }
}
